<?php
/**
 * Clase que interactua directamente con la tabla
 */
class Table{

	/**
	 * La conexión con el encargado de las consultas de la BD
	 */
	private $connection_DB;

	/**
	 * Id del objeto de la tabla
	 */
	private $id;

	/**
	 * Nombre de la Tabla
	 */
	private $table_name;

	//----------------------------------------------------------------------------
	//Función Constructor
	//----------------------------------------------------------------------------

	public function Table($new_table_name, $connection_DB){
		$this->id = 0;
		$this->table_name = $new_table_name;
		$this->connection_DB = $connection_DB;
	}

	//----------------------------------------------------------------------------
	//Funciones de consultas básicas con la base de datos
	//----------------------------------------------------------------------------

	/**
	 * Retorna el id de la instancia
	 */
	public function get_id(){
		return $this->id;
	}

	/**
	 * Retorna el campo de esta instancia dado el nombre del campo
	 */
	public function get_value($field_name){
		$params = array(array("id",$this->id));
		return $this->get_value_by_field($field_name, $params);
	}

	/**
	 * Modifica el campo dado el nombre del campo y el valor
	 */
	public function set_value($field_name, $field_value){
		$params = array(array("id",$this->id));
		$this->set_value_by_field($field_name, $params);
	}
	
	/**
	 * Actualiza los valores, en caso de no existir lo agrega a la base de datos
	 */
	public function update($params){
		$this->id = 0;
		$this->exist($params);
		
		if($this->id == 0){
			$this->add_object($params);
		}else{
			$this->update_object($params);
		}
	}
	
	/**
	 * Actualiza los valores de una tabla dado el id
	 */
	public function update_by_id($id, $params){
		$this->id = $id;
		$this->update_object($params);
	}

	//----------------------------------------------------------------------------
	//Funciones especiales para interactuar con las bases de datos
	//----------------------------------------------------------------------------

	/**
	 * Retorna el valor de un campo dado el valor y el nombre de otro campo
	 */
	public function get_value_by_field($field_name, $params){
		$query = "SELECT ".$field_name." FROM ".$this->table_name." WHERE ";
		foreach($params as $i =>$values){
			if($i != 0){
				$query .= "AND ";
			}
			$query .= " ".$params[$i][0]." = \"".$params[$i][1]."\" ";
		}
		
		$result = $this->connection_DB->get_query($query);
		$return = array();
		
		foreach($result as $i => $value){
			$return[] = $result[$i][0];
		}
		return $return;
	}

	/**
	 * Cambia el valor de un campo dado el nombre de los campos y el criterio
	 */
	public function set_value_by_field($field_name, $field_value, $params){
		$query = "UPDATE ".$this->table_name." SET ".$field_name." = ".$field_value."\" WHERE ";
		foreach($params as $i =>$values){
			if($i != 0){
				$query .= "AND ";
			}
			$query .= " ".$params[$i][0]." = \"".$params[$i][1]."\" ";
		}
		$this->connection_DB->get_query($query);
	}
	
	/**
	 * Elimina un elemento de la tabla dado un id
	 */
	public function delete_object_by_id($id){
		$query = "DELETE FROM ".$this->table_name." WHERE id = \"".$id."\"";
		$this->connection_DB->get_query($query);
	}

	/**
	 * Indica si el elemento que instancia esta clase es existente en la respectiva tabla
	 */
	private function exist($params){
		$query = "SELECT id FROM ".$this->table_name." WHERE ";
		foreach($params as $i =>$values){
			if($i != 0){
				$query .= "AND";
			}
			$query .= " ".$params[$i][0]." = \"".$params[$i][1]."\" ";
		}

		$result = $this->connection_DB->get_query($query);

		foreach($result as $i => $value){
			$this->id = $result[$i][0];
		}
	}

	/**
	 * Agrega un objeto a la tabla
	 */
	private function add_object($params){
		$query = "INSERT INTO ".$this->table_name." (id";
		$values_query = ")  VALUES (NULL";
		foreach($params as $i =>$values){
			$query .= " ,".$params[$i][0]."";
			$values_query .= " ,\"".$params[$i][1]."\"";
		}
		$values_query .=")";
		$query .= $values_query;
		$this->connection_DB->get_query($query);

		//Actualiza el id
		$result = $this->get_value_by_field("id", $params);
		foreach($result as $i => $values){
			$this->id = $result[$i];
		}
	}

	/**
	 * Actualiza los valores de la fila de la tabla
	 */
	private function update_object($params){
		$query = "UPDATE ".$this->table_name." SET";
		foreach($params as $i => $values){
			if($i != 0){
				$query .= " ,";
			}
			$query .= " ".$params[$i][0]." = '".$params[$i][1]."'";
		}
		$query .=  " WHERE id = ".$this->id;
		$this->connection_DB->get_query($query);
	}
}
?>